\chapter{坐标系}

在Manipula里有几种不同的坐标系。本章详细说明它们。

\section{世界坐标系}
世界坐标系唯一地定义了整个工作站的坐标原点。其他所有的坐标系都直接或者间接的相对于世界坐标系定义。世
界坐标系是由Manipula内置的，无需用户定义。用户也不能改变它的位置。

世界坐标系是仅存在于工作站中的概念，机器人控制器和程序中对世界坐标系是没有感知的。机器人控制器仅知道
机器人本体相对于任务坐标系的位姿，一切坐标计算都在任务坐标系中完成。

\section{任务坐标系}
对于机器人的控制器来说，它有一个概念上的坐标系，称为任务坐标系，位于世界坐标系中的某处。

当机器人被导入工作站时，任务坐标系位于机器人的底座中心，与机器人基坐标系重合。当机器人被移动时，用
户可以选择跟随机器人移动任务坐标系，或者保持任务坐标系的位置不变。机器人控制器中会保存机器人基
坐标系在任务坐标系中的相对位姿，用于将程序数据中的坐标换算成基坐标系中的坐标。

由于工件坐标系是相对于任务坐标系定义的，所以编程时出现的所有坐标数据最终都相对于任务坐标系来定义。

任务坐标系的作用是让定义机器人数据时摆脱对世界坐标系里的绝对位置的依赖。当移动机器人本体时，只需要
相应移动任务坐标系，所有的机器人数据都可以不用修改。

在一般情况下，如果不特意让任务坐标系和机器人基坐标系分离，可以认为这两个坐标系是同一个坐标系。

\section{机器人基坐标系}
机器人基坐标系是机器人自身的本地坐标系。它的原点固定于机器人底座的中心，Z轴垂直于机器人本体，X轴指向机器
人前方，Y轴指向机器人左手边。

机器人控制器保存一个基准位姿(base pose)。基准位姿定义了基坐标系相对于机器人的任务坐标系的位姿。在
初始时，基准位姿为0，所以基坐标系和任务坐标系重合。当移动机器人之后，用户可以选择让基坐标系和任
务坐标系继续重合，也可以选择让它们分离。

在编程的时候基坐标系不会被直接用到，所有的程序数据都直接或间接地相对于任务坐标系定义。控制器在执行
程序的时候，根据基准位姿，将程序中出现的坐标转换到基坐标系中，进行后续计算。

不直接使用机器人地基坐标系进行程序数据定义的原因是，机器人本体在执行任务时有可能是移动的。此外，在
多个机器人配合编程时，也希望使用统一的任务坐标系，而不是每个机器人都使用自己的基坐标系。

\section{工件坐标系}
工件坐标系描述一个工件在任务坐标系中的位姿，所以工件坐标系是相对于任务坐标系来定义的。（有一种情况是
相对于机器人的腕部坐标系来定义，详情参考数据类型手册。这里介绍的概念是指一般的情况。）

机器人程序中所有的目标点都是相对于某个工件坐标系来定义的。这样做的好处是，当工件与机器人的相对位置发
生改变时，只需要修改工件坐标系的定义就可以得到正确的目标点位置，而不需要修改每个目标点的定义。

\subsection{wobj0}
每个机器人任务有一个默认的工件坐标系，名称为wobj0。它的值是零值，所以wobj0永远和任务坐标系重合。注意，
当机器人基坐标系和任务坐标系不一致时，wobj0是在任务坐标系原点处，而不是在基坐标系原点处。

\section{工具坐标系}
工具坐标系描述机器人的工具中心点(tool center point, TCP)相对于机器人腕部（也就是法兰）的位姿。

机器人腕部相对于基坐标系的位姿由控制器根据机器人的尺寸和各个关节的角度计算出来，腕部坐标系位于法兰
的中心，Z轴垂直于法兰盘向外。机器人位于初始位姿时，腕部坐标系X轴平行于法兰盘向下，Y轴平行于法兰盘向
左。

工具坐标系的作用是让机器人控制器知道当前使用的工具的尺寸和方向，以便计算关节角度使TCP到达目标点。

\subsection{tool0}
每个机器人任务有一个默认的工具坐标系，名称为tool0. tool0的数值永远是零值。所以它与机器人腕部坐标系重合。

\section{坐标输入面板}

本软件提供两种方式来输入坐标方向：欧拉角和四元数。当选择欧拉角作为输入方式时，所有旋转均基于固定的坐
标系进行，且遵循XYZ的旋转顺序，即依次围绕固定坐标系中的X轴、Y轴、Z轴旋转，而非依次围绕对象本体坐标系
的X轴、Y轴、Z轴旋转。对应的旋转矩阵为：$R = R_z(Z) R_y(Y) R_x(X)$.
